from django.shortcuts import render, redirect
from django.template import loader, RequestContext
from django.http import HttpResponse
from booktest.models import Bookinfo


def login_required(view_func):
    """登录判断装饰器"""
    def wrapper(request, *view_args, **view_kwargs):
        # 判断用户是否登录
        if request.session.has_key('islogin'):
            # 用户已登录, 跳转到首页
            return view_func(request, *view_args, **view_kwargs)
        else:
            # 用户未登录
            return redirect('/login')

    return wrapper


# Create your views here.
def my_render(request, template_path, context={}):
    # 1.加载模板文件，获取一个模板对象
    temp = loader.get_template(template_path)
    # 2.定义模板上下文，给模板文件传数据
    # context = RequestContext(request, context)
    # 3.模板渲染，产生一个替换后的html内容
    # 不要给Template对象的render()方法传递Context对象(所以将第2步注释)，其会使用传入的字典，自动创建一个Context对象，以供使用
    res_html = temp.render(context)
    # 4.返回应答
    return HttpResponse(res_html)


def index(request):
    # return my_render(request, 'booktest/index.html')
    # Django给我们提供了一个函数render()，其工作的内容跟自定义my_render类似。
    return render(request, 'booktest/index.html')


def index2(request):
    """
    模板文件的加载顺序:
    1 首先去settings.py的TEMPLATES配置的模板目录下面去找模板文件;
    2 然后去INSTALL_APPS下面的每个应用找模板文件，前提是应用中必须有templates文件夹;
    """
    return render(request, 'booktest/index2.html')


def temp_var(request):
    """模板变量"""
    my_dict = {'title': '字典键值'}
    my_list = [1, 2, 3]
    book = Bookinfo.objects.get(id=1)

    context = {'my_dict': my_dict, 'my_list': my_list, 'book': book}
    return render(request, 'booktest/temp_var.html', context)


def temp_tags(request):
    """模板标签"""
    books = Bookinfo.objects.all()
    return render(request, 'booktest/temp_tags.html', {'books': books})


def temp_filter(request):
    books = Bookinfo.objects.all()
    return render(request, 'booktest/temp_filter.html', {'books': books})


def temp_inherit(request):
    """模板继承"""
    return render(request, 'booktest/child.html')


def html_escape(request):
    """html转义"""
    return render(request, 'booktest/html_escape.html', {'content': '<h1>hello python</h1>'})


def login(request):
    """显示登录页面"""
    # 判断用户是否登录
    if request.session.has_key('islogin'):
        # 用户已登录, 跳转到首页
        return redirect('/change_pwd')
    else:
        # 用户未登录
        # 获取cookie username
        if 'username' in request.COOKIES:
            # 获取记住的用户名
            username = request.COOKIES['username']
        else:
            username = ''

        return render(request, 'booktest/login.html', {'username': username})


def login_check(request):
    """登录校验视图"""
    # 1.获取提交的用户名和密码
    username = request.POST.get('username')
    password = request.POST.get('password')
    remember = request.POST.get('remember')
    # 2.进行登录的校验
    # 实际开发：根据用户名和密码查找数据库进行比对
    if username == 'smart' and password == '123':
        # 账号和密码正确，跳转到首页
        response = redirect('/change_pwd')

        # 判断是否需要记住用户名
        if remember == 'on':
            # 设置cookie username，过期时间1周
            response.set_cookie('username', username, max_age=7 * 24 * 3600)

        # 记住用户登录状态
        # 只有session中有islogin,就认为用户已登录
        request.session['islogin'] = True
        # 记住用户的登录名
        request.session['username'] = username
        # 返回应答
        return response
    else:
        # 账号和密码错误，跳转回登录
        return redirect('/login')
    # 3.返回应答
    # return HttpResponse('你好棒！')
    # 备注：cookie是保存在浏览器，session保存在服务器。


@login_required
def change_pwd(request):
    """显示修改密码页面"""
    # 进行用户是否登录的判断
    """ 这里可以使用加装饰器来对其进行判断
    if not request.session.has_key('islogin'):
        # 用户已登录, 跳转到首页
        return redirect('/login')
    """
    return render(request, 'booktest/change_pwd.html')


@login_required
def change_pwd_action(request):
    """模拟修改密码处理"""
    # 进行用户是否登录的判断
    """ 这里可以使用加装饰器来对其进行判断
    if not request.session.has_key('islogin'):
        # 用户已登录, 跳转到首页
        return redirect('/login')
    """
    # 1.获取新密码
    pwd = request.POST.get('pwd')
    # 获取用户名
    username = request.session.get('username')
    # 2.实际开发的时候:修改对应数据库中内容。。。
    # 3.返回应答
    return HttpResponse('%s 修改密码为:%s' % (username, pwd))
